package main

import (
	"fmt"
	"sync"
)

// SliceNum 定义一个 slice
type SliceNum []int

// NewSlice 定义一个方法初始化 slice
func NewSlice() SliceNum {
	return make(SliceNum, 0)
}

// Add 为 slice SliceNum 添加 Add 方法
func (s *SliceNum) Add(elem int) *SliceNum {

	*s = append(*s, elem)
	fmt.Println("add", elem)
	fmt.Println("add SliceNum end", s)
	return s
}

func main() {

	// 声明一个 Once
	var once sync.Once

	// 调用方法初始化一个 SliceNum
	s := NewSlice()

	// 看源代码理解once的行为
	// once.Do 包起来的方法只会执行一次
	once.Do(func() {
		s.Add(16)
	})

	once.Do(func() {
		s.Add(17)
	})

	once.Do(func() {
		s.Add(18)
	})
}
